/**
 * 
 */
package cn.biplam.front.template.control.tree;

import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.front.html.HtmlDiv;
import cn.biplam.front.html.HtmlImage;
import cn.biplam.front.html.HtmlValue;
import cn.biplam.front.html.base.HtmlWindow;
import cn.biplam.front.html.base.Const.Float_Type;
import cn.biplam.front.html.base.Const.Visibility_Mode;
import cn.biplam.front.html.base.Const.Window_Event;
import cn.biplam.front.template.Template;

/**
 * 树节点前导图标模板
 * @author 	WangSong 2009-4-11 下午11:44:06
 * @version 1.0
 */
public class PreImageOld implements Template{
	/**
根节点：
1、无哥哥(第一个节点)
	1.1、有弟弟
		1.1.1、有儿子(收起是下联加号，展开是下联减号)
		1.1.2、无儿子(单下联减号)
	1.2、无弟弟
		1.2.1、有儿子：(收起是单联加号，展开是单联减号)
		1.2.2、无儿子:(无联线减号)
2、有哥哥
	2.1、有弟弟
		2.1.1、有儿子(收起是上下联加号，展开是上下联减号)
		2.1.2、无儿子(丁字线)
	2.2、无弟弟
		2.2.1、有儿子(收起是上联加号，展开是上联减号)
		2.2.2、无儿子(折线)

非根节点前导图标判断
1、自己是该级别的节点
	1.1、有弟弟
		1.1.1、有儿子(收起是上下联加号，展开是上下联减号)
		1.1.2、无儿子(丁字线)
	1.2、无弟弟
		1.2.1、有儿子(收起是上联加号，展开是上联减号)
		1.2.2、无儿子(折线)
2、自己是该级别的下级节点
	2.1、该级别的父亲有弟弟(竖线)
	2.2、该级别的父亲无弟弟(空白)

	 */
	/**功能: 树节点前导图标的类型(包括父节点占位)*/
	public enum Image_Type{
		/**竖线(仅用于对于级别上级节点有弟弟的情况) */
		Line1("line1.gif"),
		/**折线 */
		Line2("line2.gif"),
		/**丁字线 */
		Line3("line3.gif"),
		/**无联线减号(仅用于第一个节点无儿子无弟弟的情况) */
		Minus("minus.gif"),
		/**单下联减号(仅用于第一个节点有弟弟无儿子的情况) */
		Minus1("minus1.gif"),
		/**上联减号 */
		Minus2("minus2.gif"),
		/**上下联减号 */
		Minus3("minus3.gif"),
		/**下联减号(仅用于第一个节点有儿子有弟弟的展开情况) */
		Minus4("minus4.gif"),
		/**单联减号(仅右边一条线,用于第一个节点有儿子无弟弟的展开情况) */
		Minus5("minus5.gif"),
		/**无图片(仅用于对应级别上级节点没弟弟的情况) */
		None(""),
		/**上联加号 */
		Plus2("plus2.gif"),
		/**上下联加号 */
		Plus3("plus3.gif"),
		/**下联加号(仅用于第一个节点有儿子有弟弟的收起情况) */
		Plus4("plus4.gif"),
		/**单联加号(仅右边一条线,用于第一个节点有儿子无弟弟的收起情况) */
		Plus5("plus5.gif");
		private String value;
		private Image_Type(String value){this.value=value;}
		public String toString() {return value;}
	}

	private int index=0;
	private HtmlDiv[] preImages;
	private String sHomeUrl;

	/**该节点的全局唯一ID(Tree对象ID+节点数据ID) */
	private String sNodeFullID;
	private int extendToLevel;

	/**
	 * 功能：构造方法
	 * @param sID		Tree页面对象ID(用于拼接节点图片ID,结构为:aid,nodeId,nodeType)
	 * @param sHomeUrl	主页的url
	 * @param sNodeID	该节点的数据ID
	 * @param iLevel		该节点的级别
	 * @param cHasGG		该节点是否有哥哥
	 * @param cHasDD		该节点是否有弟弟
	 * @param cHasChild		该节点是否有儿子
	 * @param fatherHasDD	该节点的各级上级是否有弟弟
	 * @param extendToLevel 树展开到第几层，null默认展开到当前节点的层次
	 * @param showPicExtend 根节点是否显示加号减号
	 * @throws ErrorMessage 
	 */
	public PreImageOld(String sID,String sHomeUrl,String sNodeID,int iLevel,
			char cHasGG,char cHasDD,char cHasChild,char[] aParentHasDD,int extendToLevel,boolean showPicExtend) throws ErrorMessage{
		if(showPicExtend){
			preImages=new HtmlDiv[iLevel];//前置图片数量=该节点的级别
		}else if(iLevel==1){
			preImages=new HtmlDiv[iLevel];//前置图片数量=该节点的级别
		}else{
			preImages=new HtmlDiv[iLevel-1];
		}
		
		this.sHomeUrl=sHomeUrl+"/images/";
		this.sNodeFullID=sID;
		if(extendToLevel>iLevel){
			this.extendToLevel = extendToLevel;
		}else{
			this.extendToLevel = iLevel;
		}

		/**一级节点单独处理，完成后直接退出*/
		if(iLevel==1){//是一级节点
			if(showPicExtend){
				if(cHasGG=='0'){//无哥哥(是树的第一个节点)
					if(cHasDD=='1'){//有弟弟
						if(cHasChild=='1'){//有儿子
							this._createDoubleImage(Image_Type.Plus4, Image_Type.Minus4,iLevel);
						}else{			   //无儿子
							this._createSingleImage(Image_Type.Line3);//Minus1
						}
					}else{			//无弟弟
						if(cHasChild=='1'){//有儿子
							this._createDoubleImage(Image_Type.Plus5, Image_Type.Minus5,iLevel);//Plus5,Minus5
						}else{			   //无儿子
							this._createSingleImage(Image_Type.Line2);//Minus
						}
					}
				}else{		//有哥哥(是第一个节点的弟弟)
					if(cHasDD=='1'){//有弟弟
						if(cHasChild=='1'){//有儿子
							this._createDoubleImage(Image_Type.Plus3, Image_Type.Minus3,iLevel);
						}else{			   //无儿子
							this._createSingleImage(Image_Type.Line3);
						}
					}else{			//无弟弟
						if(cHasChild=='1'){//有儿子
							this._createDoubleImage(Image_Type.Plus2, Image_Type.Minus2,iLevel);
						}else{			   //无儿子
							this._createSingleImage(Image_Type.Line2);
						}
					}
				}
			}else{
				preImages[this.index++]= new HtmlDiv();
			}
			return;
		}

		/**循环处理该节点的各级上级位置的前置图片(节点不会直接连接到上级的占位图标，这里只会是竖线/空白)*/
		/**判断是否减1,因为父亲是否有弟弟个数不一致(因为虚根的haveLBrother不为空比为空多一个父亲,可由数据来解决,暂由树来解决)*/
		int s = 2;
		if(showPicExtend){
			s = 1;
		}
		for(int i=s;i<iLevel;i++){
			if(i<=aParentHasDD.length && aParentHasDD[i-1]=='1'){//该级上级有弟弟
				this._createSingleImage(Image_Type.Line1);//创建竖线图标
			}else{
				this._createSingleImage(Image_Type.None);//
			}
		}

		/**处理该节点自己的占位图片*/
		if(cHasDD=='1'){//有弟弟
			if(cHasChild=='1'){//有儿子
				this._createDoubleImage(Image_Type.Plus3, Image_Type.Minus3,iLevel);
			}else{			   //无儿子
				this._createSingleImage(Image_Type.Line3);
			}
		}else{			//无弟弟
			if(cHasChild=='1'){//有儿子
				this._createDoubleImage(Image_Type.Plus2, Image_Type.Minus2,iLevel);
			}else{			   //无儿子
				this._createSingleImage(Image_Type.Line2);
			}
		}
	}

	/**
	 * 功能：依据传入的图片文件参数，创建双图片前置div(展开/收起切换)<BR>
	 * 		需要绑定点击事件
	 * @param eCollapsed		收起时的图片
	 * @param eExpanded			展开时的图片
	 * @throws ErrorMessage 
	 */
	private void _createDoubleImage(Image_Type eCollapsed,Image_Type eExpanded,int iLevel) throws ErrorMessage{
		/**创建DIV*/
		HtmlDiv frame=new HtmlDiv(null,"ti");
		HtmlDiv collapsed=this._getInnerDiv(this.sHomeUrl+eCollapsed.toString());
		collapsed.setTitle("展开");
		HtmlDiv expanded=this._getInnerDiv(this.sHomeUrl+eExpanded.toString());
		expanded.setTitle("收起");
		/**如果当前级别小于要展开到的级别,则"展开图片"隐藏，否则"收起图片"隐藏 */
		if(iLevel<this.extendToLevel){
			collapsed.setVisibility(Visibility_Mode.Hidden);
		}else{
			expanded.setVisibility(Visibility_Mode.Hidden);
		}
		//expanded.setVisibility(Visibility_Mode.Hidden);

		/**设置图片按钮ID*/
		String cid=this._getImageID("c");
		String eid=this._getImageID("e");
		collapsed.setID(cid);
		expanded.setID(eid);

		/**绑定事件*/
		collapsed.bind(Window_Event.OnClick, this._getBindScript(cid));
		expanded.bind(Window_Event.OnClick, this._getBindScript(eid));

		/**放入容器*/
		frame.put(collapsed);
		frame.put(expanded);
		this._createRid(frame);
		this.preImages[this.index++]=frame;
	}

	/**
	 * @throws ErrorMessage 
	 * 功能：依据传入的图片文件参数，创建单图片前置div(对应于上级位置的前置图片)
	 * @param image	图片文件
	 */
	private void _createSingleImage(Image_Type eImage) throws ErrorMessage{
		HtmlDiv mDiv= new HtmlDiv(null,"ti");
		mDiv.setFloat(Float_Type.Left);
		//mDiv.setBackGroundImage(this.sHomeUrl+eImage.toString());
		if(!"".equals(eImage.toString())){
			mDiv.put(new HtmlImage(this.sHomeUrl+eImage.toString(),"trp"));
		}else{
			mDiv.put(new HtmlDiv(null,"ti"));
		}
		this._createRid(mDiv);
		this.preImages[index++]=mDiv;
	}

	private void _createRid(HtmlDiv mDiv) throws ErrorMessage{
		mDiv.put(new HtmlValue(this.sNodeFullID+",csetr",
				this.sNodeFullID+",csetr",
				this.sNodeFullID.split(",")[1]));
	}

	/**
	 * 功能：返回按图片按钮ID生成的绑定脚本
	 */
	private String _getBindScript(String thisImageID){
		StringBuilder sb = new StringBuilder();
		sb.append("tk('");
		sb.append(thisImageID);
		sb.append("','");
		sb.append(this.sNodeFullID.split(",")[0]);
		sb.append("');");
		return sb.toString();
	}

	/**
	 * 功能：组装图片按钮ID，前缀是Tree对象ID+节点数据ID
	 */
	private String _getImageID(String sImageID){
		StringBuilder id=new StringBuilder();
		id.append(this.sNodeFullID);
		id.append(',');
		id.append(sImageID);
		return id.toString();
	}

	/**
	 * 功能：创建一个用于图片切换的内置Div
	 */
	private HtmlDiv _getInnerDiv(String imageUrl) throws ErrorMessage{
		HtmlDiv mDiv=new HtmlDiv(null,"tinorm");
		mDiv.put(new HtmlImage(imageUrl));
		return mDiv;
	}

	/**
	 * 功能：返回设置好的HtmlWindow对象
	 * @return
	 */
	public HtmlWindow get(){
		return null;

	}

	/**
	 * 功能：返回是否还有下一个HtmlWindow对象
	 * @return
	 */
	public boolean haveNext(){
		return true;
	}

	public HtmlDiv[] getAll(){
		return this.preImages;
	}

}
